#ifndef __METRICA__
#define __METRICA__

#include <iostream>
#include "./../malla/malla.h"

using namespace std;

class Metrica {
    public:
        static double getResistencia(const Malla&);
        static double cantidadCeldas(const Malla&);
        static double celdasCompartidas(const Malla&);
        static double celdasCompartidasPromedio(const Malla&);
    private:
        Metrica();
};

double Metrica::getResistencia(const Malla& malla) {
    return malla.getResistencia();
}


double Metrica::cantidadCeldas(const Malla& malla) {
    double cant=0;
    for(int i=0;i<malla.size();i++) {
        for(int j=0;j<malla.size();j++) {
            cant+= (malla.getCelda(i,j).esCelda()?1:0);
        }
    }

    return cant;
}

double Metrica::celdasCompartidas(const Malla& malla) {
    double cant=0;
    //todas las de adentro
    for(int i=1;i<malla.size()-1;i++) {
        for(int j=1;j<malla.size()-1;j++) {
            if(malla.getCelda(i,j).esCelda()) {
                cant+= malla.getCelda(i-1,j).esCelda()?1:0;
                cant+= malla.getCelda(i+1,j).esCelda()?1:0;
                cant+= malla.getCelda(i,j-1).esCelda()?1:0;
                cant+= malla.getCelda(i,j+1).esCelda()?1:0;
            }
        }
    }
    for(int i=0;i<malla.size();i++) { //borde superior
        if(malla.getCelda(0,i).esCelda()) {
            cant+= (i>0 && malla.getCelda(0,i-1).esCelda())?1:0;
            cant+= (i<malla.size()-1 && malla.getCelda(0,i+1).esCelda())?1:0;
            cant+= (malla.getCelda(1,i).esCelda())?1:0;
        }
    }
    for(int i=1;i<malla.size()-1;i++) { //borde izq
        if(malla.getCelda(i,0).esCelda()) {
            cant+= (malla.getCelda(i-1,0).esCelda())?1:0;
            cant+= (malla.getCelda(i,1).esCelda())?1:0;
            cant+= (malla.getCelda(i+1,0).esCelda())?1:0;
        }
    }
    for(int i=1;i<malla.size()-1;i++) { //borde der
        if(malla.getCelda(i,malla.size()-1).esCelda()) {
            cant+= (malla.getCelda(i-1,malla.size()-1).esCelda())?1:0;
            cant+= (malla.getCelda(i,malla.size()-2).esCelda())?1:0;
            cant+= (malla.getCelda(i+1,malla.size()-1).esCelda())?1:0;
        }
    }
    for(int i=0;i<malla.size();i++) { //borde superior
        if(malla.getCelda(malla.size()-1,i).esCelda()) {
            cant+= (i>0 && malla.getCelda(malla.size()-1,i-1).esCelda())?1:0;
            cant+= (i<malla.size()-1 && malla.getCelda(malla.size()-1,i+1).esCelda())?1:0;
            cant+= (malla.getCelda(malla.size()-2,i).esCelda())?1:0;
        }
    }
    return cant;

}

double Metrica::celdasCompartidasPromedio(const Malla& malla) {
    return Metrica::celdasCompartidas(malla)/Metrica::cantidadCeldas(malla);
}


#endif

